package day29.homework;

import java.io.*;

/**
 * 软件试用次数管理程序
 * 该程序实现了一个简单的软件试用次数限制功能，用户可以试用软件10次
 * 程序通过文件持久化存储试用次数，每次启动软件都会减少一次试用次数
 * 当试用次数用完后，程序将拒绝启动并提示用户购买正版软件
 */
public class hw9 {
    /**
     * 定义试用次数文件路径常量
     * 该常量用于指定存储剩余使用次数的文件名
     * 使用private修饰符确保只能在本类内部访问
     * 使用static修饰符表示这是类级别的常量，所有实例共享
     * 使用final修饰符确保该值不可更改，符合常量的定义
     * 常量名为USAGE_FILE，值为"usage_count.txt"
     */
    private static final String USAGE_FILE = "usage_count.txt";
    
    /**
     * 程序主入口方法
     * 负责控制软件启动流程，检查试用次数并更新剩余次数
     * @param args 命令行参数数组，本程序未使用
     */
    public static void main(String[] args) {
        // 调用getRemainingUsage()方法获取当前剩余的试用次数
        // 这个方法会从文件中读取上次保存的使用次数
        // 如果是首次运行或文件不存在，则返回默认值10
        int remainingUsage = getRemainingUsage();
        
        // 检查剩余使用次数是否大于0，大于0表示还有试用机会可以使用
        // 这是一个条件判断语句，用于决定是否允许软件启动
        if (remainingUsage > 0) {
            // 进入if代码块表示还有试用次数可用
            // 将剩余使用次数减1，表示本次启动消耗了一次试用机会
            remainingUsage--;
            // 调用saveRemainingUsage方法将更新后的剩余次数保存到文件中
            // 这样可以实现数据的持久化存储，下次启动时能读取到最新的次数
            saveRemainingUsage(remainingUsage);
            
            // 输出软件启动成功的提示信息
            System.out.println("软件启动成功！");
            // 输出当前剩余的试用次数，让用户了解还能使用多少次
            System.out.println("剩余试用次数: " + remainingUsage);
            
            // 特殊情况处理：检查使用后剩余次数是否为0
            // 这是一个嵌套的条件判断，用于处理试用次数刚好用完的情况
            if (remainingUsage == 0) {
                // 当剩余次数为0时，输出提醒信息，告知用户试用期已结束
                // 并建议用户购买正版软件以继续使用
                System.out.println("试用次数已用完，请购买正版软件以继续使用！");
            }
        } else {
            // 进入else代码块表示已无剩余使用次数
            // 直接拒绝软件启动并输出提示信息
            System.out.println("试用次数已用完，请购买正版软件！");
        }
    }
    
    /**
     * 获取剩余使用次数的方法
     * 该方法负责从文件中读取上次保存的使用次数
     * 如果文件不存在（首次运行）或读取失败，则返回默认值10
     * @return int类型，表示剩余使用次数
     */
    private static int getRemainingUsage() {
        // 使用try-catch语句块处理可能出现的异常情况
        // 因为文件操作可能会抛出IOException等异常
        try {
            // 创建BufferedReader对象用于读取文件内容
            // FileReader用于打开指定文件，BufferedReader提供缓冲功能提高读取效率
            // USAGE_FILE是之前定义的文件路径常量
            BufferedReader reader = new BufferedReader(new FileReader(USAGE_FILE));
            // 读取文件中的第一行内容，使用readLine()方法
            // 将读取到的字符串通过Integer.parseInt()方法转换为整数
            // 这个整数就是上次保存的剩余使用次数
            int count = Integer.parseInt(reader.readLine());
            // 关闭文件读取器，释放相关资源，这是一个重要的资源管理操作
            reader.close();
            // 返回读取到的使用次数
            return count;
        } catch (FileNotFoundException e) {
            // 捕获FileNotFoundException异常，表示文件不存在
            // 这通常发生在程序首次运行时，因为usage_count.txt文件还未创建
            // 返回默认值10，表示用户有10次试用机会
            return 10;
        } catch (IOException | NumberFormatException e) {
            // 捕获IOException和NumberFormatException异常
            // IOException表示读取文件时发生IO错误
            // NumberFormatException表示文件内容不是有效的数字格式
            // 在这些情况下，也返回默认值10，确保程序能正常运行
            return 10;
        }
    }
    
    /**
     * 保存剩余使用次数到文件的方法
     * 该方法负责将当前剩余使用次数写入文件，实现数据持久化
     * @param count int类型，表示要保存的剩余使用次数
     */
    private static void saveRemainingUsage(int count) {
        // 使用try-catch语句块处理文件写入过程中可能出现的异常
        try {
            // 创建BufferedWriter对象用于写入文件内容
            // FileWriter用于创建或打开指定文件，BufferedWriter提供缓冲功能提高写入效率
            // USAGE_FILE是之前定义的文件路径常量
            BufferedWriter writer = new BufferedWriter(new FileWriter(USAGE_FILE));
            // 将传入的剩余次数count转换为字符串形式
            // 使用String.valueOf()方法进行类型转换
            // 然后通过write()方法将字符串写入文件
            writer.write(String.valueOf(count));
            // 关闭文件写入器，确保数据被正确写入文件并释放相关资源
            // 这是一个重要的资源管理操作，如果不关闭可能导致数据丢失
            writer.close();
        } catch (IOException e) {
            // 捕获IOException异常，表示文件写入过程中发生了错误
            // 输出错误信息到标准错误流，让用户了解保存失败的情况
            // e.getMessage()获取具体的异常信息，帮助定位问题
            System.err.println("保存使用次数时出错: " + e.getMessage());
        }
    }
}